STM32与ESP32的硬件SPI通信(个人学习记录)

您所在的位置:网站首页 arduino hid通信 STM32与ESP32的硬件SPI通信(个人学习记录)

STM32与ESP32的硬件SPI通信(个人学习记录)

#STM32与ESP32的硬件SPI通信(个人学习记录)| 来源: 网络整理| 查看: 265

一、硬件配置

        STM32F103ZET6作为主机,使用SPI2,ESP32S2作为从机,进行SPI双向通信;硬件接线如下:

                                                主机                        从机

CS                                           PB12 ——————  14

MOSI                                        PB6 ——————    2

MISO                                       PB14 ——————  13

CLK                                         PB15 ——————  12

HANDSHAKE                         PB13 ——————   15

GND                                        GND ——————   GND   

(地线一定相连在一起,不然传输的数据会乱码)

二、主机代码 #define SPI2READY PBin(6) //读取握手线是否准备好 void SPI2_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB |RCC_APB2Periph_AFIO, ENABLE ); RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE );//SPI2时钟使能 //CS片选线 GPIO_InitStructure.GPIO_Pin =GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //PB12推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB //HANDSHAKE 握手线 GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PB6下拉输入 GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin =GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //PB13/14/15复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //PB13/14/15上拉 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //SPI发送接收8位帧结构 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //串行同步时钟的空闲状态为高电平 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //第一个跳变沿数据被采样 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //软件管理 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;//预分频值为256 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从MSB位开始 SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式 SPI_Init(SPI2, &SPI_InitStructure); //初始化外设SPIx寄存器 SPI_Cmd(SPI2, ENABLE); //使能SPI外设 } //SPIx 读写一个字节 //TxData:要写入的字节 //返回值:读取到的字节 u8 SPI2_ReadWriteByte(u8 TxData) { u8 retry=0; while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) { retry++; if(retry>200) return 0; //发送上一个数据时间过长,报错 } SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据 retry=0; while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) { retry++; if(retry>200) return 0; } return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据 } u8 TXBuffer[128]; u8 RXBuffer[128]; int main(void) { u16 i=0; delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2 uart_init(115200); //串口初始化为115200 LED_Init(); //初始化与LED连接的硬件接口 SPI2_Init(); for (i = 0; i < 10; i++) //给发送数组赋初值 { TXBuffer[i] = 0x47+i; } while(1) { if(SPI2READY==1) //如果从机准备好接收 { GPIO_ResetBits(GPIOB,GPIO_Pin_12); //拉低CS for(i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3